﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace LEDScreen
{
    static class ClsLED
    {
        public const int FONT_SET_16 = 0 ;           //16点阵字符
        public const int FONT_SET_24 = 1 ;          //24点阵字符

        public const int PKC_QUERY = 4;
        public const int PKC_ADJUST_TIME = 6;
        public const int PKC_GET_POWER = 9;
        public const int PKC_SET_POWER = 10;
        public const int PKC_GET_BRIGHT = 11;
        public const int PKC_SET_BRIGHT = 12;

        //public const LEDAPI _stdcall;

        public const int DEV_COM = 0;              //串口通讯
        public const int DEV_UDP = 1;             //UDP通讯
        public const int DEV_MODEM = 2;             //Modem通讯

        public const int SBR_9600 = 0;            //串口速率9600
        public const int SBR_14400 = 1;             //14400
        public const int SBR_19200 = 2;             //串口速率19200
        public const int SBR_38400 = 3;             //串口速率38400
        public const int SBR_57600 = 4;             //串口速率57600
        public const int SBR_115200 = 5;             //串口速率115200

        public const int ROOT_PLAY = 0x11;       //下发节目为播放数据
        public const int ROOT_DOWNLOAD = 0x12;        //下发节目为保存并播放

        public const int SCREEN_UNICOLOR = 1;       //单色显示屏
        public const int SCREEN_COLOR = 2;       //双色显示屏
        public const int SCREEN_FULLCOLOR = 3;       //全彩色显示屏
        public const int SCREEN_GRAY = 4;       //256级灰度屏

        public const int LM_RX_COMPLETE = 1;
        public const int LM_TX_COMPLETE = 2;
        public const int LM_RESPOND = 3;
        public const int LM_TIMEOUT = 4;
        public const int LM_NOTIFY = 5;
        public const int LM_PARAM = 6;
        public const int LM_TX_PROGRESS = 7;
        public const int LM_RX_PROGRESS = 8;

        //时间格式定义，用于AddDateTime函数中format参数
        public const int DF_YMD = 1;       //年月日 "2004年12月31日"
        public const int DF_HN = 2;       //时分    "19:20"
        public const int DF_HNS = 3;       //时分秒 "19:20:30" 
        public const int DF_Y = 4;       //年      "2004"
        public const int DF_M = 5;       //月      "12" "01" 注意：始终显示两位数字
        public const int DF_D = 6;       //日
        public const int DF_H = 7;       //时
        public const int DF_N = 8;       //分
        public const int DF_S = 9;      //秒
        public const int DF_W = 10;       //星期    "星期三"

        //正计时、倒计时format参数
        public const int CF_DAY = 0;               //天数
        public const int CF_HOUR = 1;               //小时数
        public const int CF_HMS = 2;               //时分秒
        public const int CF_HM = 3;               //时分
        public const int CF_MS = 4;               //分秒
        public const int CF_S = 5;               //秒

        public const int LEM_BUFFER_FULL = 1;        //错误代码：发送缓冲满
        public const int LED_POWER_ON = 1;        //显示屏电源打开
        public const int LED_POWER_OFF = 0;        //显示屏电源已关闭

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public struct DEVICEPARAM
        {
            [MarshalAs(UnmanagedType.I4)]
            public Int32 devType;                   //通讯设备类型
            [MarshalAs(UnmanagedType.I4)]
            public Int32 speed;                     //通讯速度(仅对串行通讯有用)
            [MarshalAs(UnmanagedType.I4)]
            public Int32 ComPort;                   //本地端口(对串行通讯为：串口号；对UDP通讯为：本地端口号，一般要大于1024)
            [MarshalAs(UnmanagedType.I4)]
            public Int32 FlowCon;                   //远程端口号(对UDP通讯有用，必须为6666)\
            [MarshalAs(UnmanagedType.I4)]
            public Int32 locPort;                   //未用
            [MarshalAs(UnmanagedType.I4)]
            public Int32 rmtPort;
            [MarshalAs(UnmanagedType.I4)]
            public Int32 memory;
            [MarshalAs(UnmanagedType.I4,SizeConst = 6)]
            public Int32 Reserved;
        };

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public struct TNotifyMessage
        {
            [MarshalAs(UnmanagedType.I4)]
            public Int32 Message;
            [MarshalAs(UnmanagedType.I4)]
            public Int32 Command;
            [MarshalAs(UnmanagedType.I4)]
            public Int32 Result;
            [MarshalAs(UnmanagedType.I4)]
            public Int32 Status;
            [MarshalAs(UnmanagedType.I4)]
            public Int32 Address;
            [MarshalAs(UnmanagedType.I4)]
            public Int32 Size;
            [MarshalAs(UnmanagedType.I4)]
            public Int32 Buffer;
            public DEVICEPARAM param;
            [MarshalAs(UnmanagedType.U1, SizeConst = 16)]
            public char Host;
            [MarshalAs(UnmanagedType.I4)]
            public Int32 Port;
        }
        public struct rect
        {
            public Int32 left;
            public Int32 top;
            public Int32 right;
            public Int32 bottom;
        };

        public struct TIMESTAMP
        {
          Int32 date;
          long time;
        };
             
        /// <summary>
        /// 初始化LEDSender动态链接库
        /// </summary>
        [DllImport("LEDSender.dll",EntryPoint="LED_Startup",CharSet=CharSet.Ansi)]
        public static extern void LED_Startup();
        /// <summary>
        /// 终止LEDSender动态链接库
        /// </summary>
        [DllImport("LEDSender.dll", EntryPoint = "LED_Cleanup", CharSet = CharSet.Ansi)]
        public static extern void LED_Cleanup();
        /// <summary>
        /// 打开通讯信道
        /// </summary>
        /// <param name="param"></param>
        /// <param name="Notify"></param>
        /// <param name="Window"></param>
        /// <param name="Message"></param>
        /// <returns></returns>
        [DllImport("LEDSender.dll", EntryPoint = "LED_Open", CharSet = CharSet.Ansi)]
        public static extern Int32 LED_Open(ref DEVICEPARAM param, Int32 Notify, Int32 Window, Int32 Message);
        /// <summary>
        /// 关闭通讯信道
        /// </summary>
        /// <param name="dev"></param>
        /// <returns></returns>
        [DllImport("LEDSender.dll", EntryPoint = "LED_Close", CharSet = CharSet.Ansi)]
        public static extern Int32 LED_Close(Int32 dev);
        /// <summary>
        /// 查询显示屏状态
        /// </summary>
        /// <param name="dev"></param>
        /// <param name="Group"></param>
        /// <param name="ScrNo"></param>
        /// <param name="Host"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        [DllImport("LEDSender.dll", EntryPoint = "LED_Query", CharSet = CharSet.Ansi)]
        public static extern Int32 LED_Query(Int32 dev, byte Group, ref char[] Host, Int32 port);
        /// <summary>
        /// 校正显示屏时间
        /// </summary>
        /// <param name="dev"></param>
        /// <param name="Group"></param>
        /// <param name="ScrNo"></param>
        /// <param name="Host"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        [DllImport("LEDSender.dll", EntryPoint = "LED_AdjustTime", CharSet = CharSet.Ansi)]
        public static extern Int32 LED_AdjustTime(Int32 dev, byte Group, byte ScrNo, ref char[] Host, Int32 port);

        /// <summary>
        /// 发送数据到显示屏
        /// </summary>
        /// <param name="dev"></param>
        /// <param name="Group"></param>
        /// <param name="ScrNo"></param>
        /// <param name="Host"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        [DllImport("LEDSender.dll", EntryPoint = "LED_SendToScreen", CharSet = CharSet.Ansi)]
        public static extern Int32 LED_SendToScreen(Int32 dev, Byte Address, string Host, Int32 Port);
        /// <summary>
        /// 设置显示屏电源
        /// </summary>
        /// <param name="dev"></param>
        /// <param name="Group"></param>
        /// <param name="ScrNo"></param>
        /// <param name="Host"></param>
        /// <param name="port"></param>
        /// <param name="Power"></param>
        /// <returns></returns>
        [DllImport("LEDSender.dll", EntryPoint = "LED_SetPower", CharSet = CharSet.Ansi)]
        public static extern Int32 LED_SetPower(Int32 dev, byte Group, byte ScrNo, string Host, Int32 port, Int32 Power);
        /// <summary>
        /// 读取显示屏电源状态
        /// </summary>
        /// <param name="dev"></param>
        /// <param name="Group"></param>
        /// <param name="ScrNo"></param>
        /// <param name="Host"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        [DllImport("LEDSender.dll", EntryPoint = "LED_GetPower", CharSet = CharSet.Ansi)]
        public static extern Int32 LED_GetPower(Int32 dev, byte Group, byte ScrNo, string Host, Int32 port);
        /// <summary>
        /// 调整显示屏亮度
        /// </summary>
        /// <param name="dev"></param>
        /// <param name="Group"></param>
        /// <param name="ScrNo"></param>
        /// <param name="Host"></param>
        /// <param name="port"></param>
        /// <param name="Brightness"></param>
        /// <returns></returns>
        [DllImport("LEDSender.dll", EntryPoint = "LED_SetBrightness", CharSet = CharSet.Ansi)]
        public static extern Int32 LED_SetBrightness(Int32 dev, byte Group, byte ScrNo, ref char[] Host, Int32 port, byte Brightness);
        /// <summary>
        /// 调整显示屏IP地址
        /// </summary>
        /// <param name="dev"></param>
        /// <param name="Group"></param>
        /// <param name="ScrNo"></param>
        /// <param name="Host"></param>
        /// <param name="port"></param>
        /// <param name="NewIP"></param>
        /// <returns></returns>
        [DllImport("LEDSender.dll", EntryPoint = "LED_SetIPAddress", CharSet = CharSet.Ansi)]
        public static extern Int32 LED_SetIPAddress(Int32 dev, byte Group, byte ScrNo, ref char[] Host, Int32 port, ref char[] NewIP);
        /// <summary>
        /// 
        /// </summary>
        /// <param name="dev"></param>
        /// <param name="Group"></param>
        /// <param name="ScrNo"></param>
        /// <param name="Host"></param>
        /// <param name="port"></param>
        /// <param name="filename"></param>
        /// <returns></returns>
        [DllImport("LEDSender.dll", EntryPoint = "LED_DownLoadFontSet", CharSet = CharSet.Ansi)]
        public static extern Int32 LED_DownLoadFontSet(Int32 dev, byte Group, byte ScrNo, ref char[] Host, Int32 port, ref char[] filename);
        /// <summary>
        /// 开始形成发送数据
        /// </summary>
        /// <param name="RootType"></param>
        /// <param name="ScreenType"></param>
        /// <returns></returns>
        [DllImport("LEDSender.dll", EntryPoint = "MakeRoot", CharSet = CharSet.Ansi)]
        public static extern Int32 MakeRoot(Int32 RootType, Int32 ScreenType);
        /// <summary>
        /// 追加显示页面
        /// </summary>
        /// <param name="DisplayTime"></param>
        /// <returns></returns>
        [DllImport("LEDSender.dll", EntryPoint = "AddLeaf", CharSet = CharSet.Ansi)]
        public static extern Int32 AddLeaf(Int32 DisplayTime);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="rect1"></param>
        /// <param name="left"></param>
        /// <param name="top"></param>
        /// <param name="right"></param>
        /// <param name="bottom"></param>
        [DllImport("user32.dll", EntryPoint = "SetRect", CharSet = CharSet.Ansi)]
        public static extern void SetRect(ref rect rect1, Int32 left, Int32 top, Int32 right, Int32 bottom);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="dc"></param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <param name="rect"></param>
        /// <param name="method"></param>
        /// <param name="speed"></param>
        /// <param name="transparent"></param>
        /// <returns></returns>
        [DllImport("LEDSender.dll", EntryPoint = "LED_GetNotifyMessage", CharSet = CharSet.Ansi)]
        public static extern Int32 LED_GetNotifyMessage(ref TNotifyMessage Notify);

        /// <summary>
        /// 追加时间显示
        /// </summary>
        /// <param name="rect"></param>
        /// <param name="transparent"></param>
        /// <param name="fontname"></param>
        /// <param name="fontsize"></param>
        /// <param name="fontcolor"></param>
        /// <param name="format"></param>
        /// <returns></returns>
        //[DllImport("LEDSender.dll", EntryPoint = "AddDateTime", CharSet = CharSet.Ansi)]
        //public extern Int32 AddDateTime(LPRECT rect, Int32 transparent, ref char[] fontname, Int32 fontsize, Int32 fontcolor, Int32 format);
        /// <summary>
        /// 显示内码汉字
        /// </summary>
        /// <param name="str"></param>
        /// <param name="rect"></param>
        /// <param name="method"></param>
        /// <param name="speed"></param>
        /// <param name="transparent"></param>
        /// <param name="fontset"></param>
        /// <param name="fontcolor"></param>
        /// <returns></returns>
        [DllImport("LEDSender.dll", EntryPoint = "AddString", CharSet = CharSet.Ansi)]
        public static extern Int32 AddString(string str, ref rect rect1, Int32 method, Int32 speed, Int32 transparent, Int32 fontset, Int32 fontcolor);

        //[DllImport("LEDSender.dll", EntryPoint = "AddText", CharSet = CharSet.Ansi)]
        //public extern Int32 AddText(ref char[] str, LPRECT rect, Int32 method, Int32 speed, Int32 transparent, ref char[] fontname, Int32 fontsize, Int32 fontcolor);
        /// <summary>
        /// 加动画显示区域(只有256级灰度和全彩色才可显示动画)
        /// </summary>
        /// <param name="filename"></param>
        /// <param name="rect"></param>
        /// <param name="stretch"></param>
        /// <returns></returns>
        //[DllImport("LEDSender.dll", EntryPoint = "AddMovie", CharSet = CharSet.Ansi)]
        //public extern Int32 AddMovie(ref char[] filename, LPRECT rect, Int32 stretch);
        /// <summary>
        /// 追加正计时显示区域
        /// </summary>
        /// <param name="rect"></param>
        /// <param name="transparent"></param>
        /// <param name="fontname"></param>
        /// <param name="fontsize"></param>
        /// <param name="fontcolor"></param>
        /// <param name="format"></param>
        /// <param name="starttime"></param>
        /// <returns></returns>
        //[DllImport("LEDSender.dll", EntryPoint = "AddCountUp", CharSet = CharSet.Ansi)]
        //public extern Int32 AddCountUp(LPRECT rect, Int32 transparent, ref char[] fontname, Int32 fontsize, Int32 fontcolor, Int32 format, LPSYSTEMTIME starttime);
        /// <summary>
        /// 追加倒计时显示区域
        /// </summary>
        /// <param name="rect"></param>
        /// <param name="transparent"></param>
        /// <param name="fontname"></param>
        /// <param name="fontsize"></param>
        /// <param name="fontcolor"></param>
        /// <param name="format"></param>
        /// <param name="endtime"></param>
        /// <returns></returns>
        //[DllImport("LEDSender.dll", EntryPoint = "AddCountDown", CharSet = CharSet.Ansi)]
        //public extern Int32 AddCountDown(LPRECT rect, Int32 transparent, ref char[] fontname, Int32 fontsize, Int32 fontcolor, long format, LPSYSTEMTIME endtime);

    }
}
